package net.interneteidee.utility;

import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.MediaType;

import org.richfaces.component.UIExtendedDataTable;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;

import net.interneteidee.entity.Categoria;
import net.interneteidee.entity.Cliente;
import net.interneteidee.entity.Famiglia;
import net.interneteidee.entity.Prodotto;
import net.interneteidee.entity.ProdottoEsterno;
import net.interneteidee.entity.Regione;
import net.interneteidee.servizi.ClienteService;
import net.interneteidee.servizi.ProdottoCategoriaFamigliaService;

@ManagedBean
@SessionScoped
public class SelectBean implements ComponentName {

	private List<Famiglia> famigleSelezionate;
	private List<Categoria> categorieSelezionate;
	
	private List<Cliente>  clientiAttivi;
	private List<Prodotto> prodottiAttivi;
	private List<ProdottoEsterno> prodottiEsterni;
	private List<Regione> regioni;
	
	private Cliente clienteSelezionato;
	private Prodotto prodottoSelezionato;
	
	protected String selectionMode = "single";
	protected Collection<Object> selection;
	
	private boolean expans = false;
	private int contatoreProdottiEsterniAggiunti;
	
	@Inject
	ProdottoCategoriaFamigliaService prodottoCategoriaFamigliaService;
	
	@Inject
	ClienteService clienteService;
	
	public SelectBean() {
		// TODO Auto-generated constructor stub
		famigleSelezionate = new LinkedList<Famiglia>();
		categorieSelezionate = new LinkedList<Categoria>();
		regioni = new LinkedList<Regione>();
	}
	
	public void tableListener(AjaxBehaviorEvent event) {
		UIExtendedDataTable dataTable = (UIExtendedDataTable) event.getComponent();
		Object originalKey = dataTable.getRowKey();
		initObject(dataTable);
		for (Object selectionKey : selection) {
			dataTable.setRowKey(selectionKey);
			if (dataTable.isRowAvailable()) {
				getObject(dataTable);
			}
		}
		dataTable.setRowKey(originalKey);
	}
	
	public void initObject(UIExtendedDataTable dataTable){
		
		if(dataTable.getId().equals(tabellaRicercaClienti))
			clienteSelezionato = new Cliente();
		else if(dataTable.getId().equals(tabellaRicercaProdotti))
			prodottoSelezionato = new Prodotto();

	}
	
	public void getObject(UIExtendedDataTable dataTable){
		
		if(dataTable.getId().equals(tabellaRicercaClienti))
			clienteSelezionato = (Cliente) dataTable.getRowData();
		else if(dataTable.getId().equals(tabellaRicercaProdotti))
			prodottoSelezionato = (Prodotto) dataTable.getRowData();

		
	}
	
	
	public void selectFamiglie(ActionEvent event){
		
		famigleSelezionate = prodottoCategoriaFamigliaService.findAllFamiglie();
		categorieSelezionate = prodottoCategoriaFamigliaService.findAllCategorie();
		System.out.println("Numero Famiglie "+famigleSelezionate.size());	
	}
	
	public void selectCategorie(ActionEvent event){
		
		categorieSelezionate = prodottoCategoriaFamigliaService.findAllCategorie();
		System.out.println("Numero Categorie "+categorieSelezionate.size());	
	}
	
	public void getProdottiFromCurdBee(){

		contatoreProdottiEsterniAggiunti=0;
		Client client = Client.create();
		client.addFilter(new HTTPBasicAuthFilter("rino.covelli@gmail.com","Tobbissino"));
		WebResource webResource = client.resource("https://gefo.curdbee.com/items.xml");
		ClientResponse clientResponse = webResource.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
		prodottiEsterni = clientResponse.getEntity(new GenericType<List<ProdottoEsterno>>() {
		});

		for(ProdottoEsterno prodottoEsterno : prodottiEsterni)
			if(!prodottoCategoriaFamigliaService.findProdottoByCodice(prodottoEsterno.getId())){
				prodottoCategoriaFamigliaService.addProdotto(new Prodotto(prodottoEsterno));
				contatoreProdottiEsterniAggiunti++;
			}
				

	}
	
	/**
	 * Seleziona tutti i clienti
	 * @param event
	 */
	public void findAllClienti(ActionEvent event){
		
		clientiAttivi = clienteService.findAllClients();
	}
	
	public void findAllProdottiAttivi(ActionEvent event){
		prodottiAttivi = prodottoCategoriaFamigliaService.findAllProdotti();
	}
	

	public void findClientiAttivi(){
		clientiAttivi = clienteService.findClientiAttivi();
	}
	

	
	public void findAllRegioni(ActionEvent event){
		regioni = clienteService.findAllRegione();
	}
	
	public List<Famiglia> getFamigleSelezionate() {
		return famigleSelezionate;
	}
	
	public void setFamigleSelezionate(List<Famiglia> famigleSelezionate) {
		this.famigleSelezionate = famigleSelezionate;
	}

	public List<Categoria> getCategorieSelezionate() {
		return categorieSelezionate;
	}

	public void setCategorieSelezionate(List<Categoria> categorieSelezionate) {
		this.categorieSelezionate = categorieSelezionate;
	}

	public List<Cliente> getClientiAttivi() {
		return clientiAttivi;
	}

	public void setClientiAttivi(List<Cliente> clientiAttivi) {
		this.clientiAttivi = clientiAttivi;
	}
	
	
	
	public Cliente getClienteSelezionato() {
		return clienteSelezionato;
	}

	public void setClienteSelezionato(Cliente clienteSelezionato) {
		this.clienteSelezionato = clienteSelezionato;
	}

	public String getSelectionMode() {
		return selectionMode;
	}

	public void setSelectionMode(String selectionMode) {
		this.selectionMode = selectionMode;
	}

	public Collection<Object> getSelection() {
		return selection;
	}

	public void setSelection(Collection<Object> selection) {
		this.selection = selection;
	}

	public List<Prodotto> getProdottiAttivi() {
		return prodottiAttivi;
	}

	public void setProdottiAttivi(List<Prodotto> prodottiAttivi) {
		this.prodottiAttivi = prodottiAttivi;
	}

	public Prodotto getProdottoSelezionato() {
		return prodottoSelezionato;
	}

	public void setProdottoSelezionato(Prodotto prodottoSelezionato) {
		this.prodottoSelezionato = prodottoSelezionato;
	}

	public List<Regione> getRegioni() {
		return regioni;
	}

	public void setRegioni(List<Regione> regioni) {
		this.regioni = regioni;
	}

	public boolean isExpans() {
		return expans;
	}

	public void setExpans(boolean expans) {
		this.expans = expans;
	}

	public List<ProdottoEsterno> getProdottiEsterni() {
		return prodottiEsterni;
	}

	public void setProdottiEsterni(List<ProdottoEsterno> prodottiEsterni) {
		this.prodottiEsterni = prodottiEsterni;
	}

	public int getContatoreProdottiEsterniAggiunti() {
		return contatoreProdottiEsterniAggiunti;
	}

	public void setContatoreProdottiEsterniAggiunti(
			int contatoreProdottiEsterniAggiunti) {
		this.contatoreProdottiEsterniAggiunti = contatoreProdottiEsterniAggiunti;
	}
	
	
	
	
	
	
}
